package com.ljxt.dt.util;

import com.ljxt.dt.util.xhq.StringUtil;

import javax.servlet.http.HttpServletRequest;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.Serializable;

/**
 * @author 徐浩钦
 * @version 1.0.0
 * @date 2020/5/2 9:45
 * @copyright 老九学堂T11
 */
public class RequestUtil implements Serializable {
    /**
     * 根据请求的 request 的请求参数与 java 对象匹配，并进行设置
     * @param request 请求的对象
     * @param clazz 匹配的 java 对象的类
     * @param <T> 指定的类型
     * @return 最终匹配结束并设置完的结果
     */
    public static <T> T reqToObj(HttpServletRequest request, Class<T> clazz){
        T returned = null;

        try {
            // 实例化对象
            returned = clazz.newInstance();
            // 获得这个类对象的 BeanInfo 信息
            BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
            // 根据 BeanInfo 信息 获取它的属性描述符
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();

            // 遍历属性描述符
            for (PropertyDescriptor pro: propertyDescriptors) {
                // 获取这个属性描述的变量名
                String proName = pro.getName();
                // 根据这个变量名在请求的表单中查询是否存在
                String str =  request.getParameter(proName);

                // 如果属性不存在则结束本次循环
                if(StringUtil.isNullAndEmpty(str)){
                    continue;
                }

                // 获取这个属性的 class 类型
                Class type = pro.getPropertyType();

                System.out.println("proName = " + proName);

                System.out.println("str = "+str);
                System.out.println("type = "+type);
                System.out.println("-----------------------");


//                System.out.println(str == String.class);

                // 需要添加正则表达式判断

                // 判断类型并转换
                try {
                    if(type == int.class || type == Integer.class){
                        pro.getWriteMethod().invoke(returned,Integer.parseInt(str));
                    }else if(type == byte.class || type == Byte.class){
                        pro.getWriteMethod().invoke(returned,Byte.parseByte(str));
                    }else if(type == short.class || type == Short.class){
                        pro.getWriteMethod().invoke(returned,Short.parseShort(str));
                    }else if(type == long.class || type == Long.class){
                        pro.getWriteMethod().invoke(returned,Long.parseLong(str));
                    }else if(type == float.class || type == Float.class){
                        pro.getWriteMethod().invoke(returned,Float.parseFloat(str));
                    }else if(type == double.class || type == Double.class){
                        pro.getWriteMethod().invoke(returned,Double.parseDouble(str));
                    }else if(type == boolean.class || type == Boolean.class){
                        if(str.equals("true")){
                            pro.getWriteMethod().invoke(returned,true);
                        }else{
                            pro.getWriteMethod().invoke(returned,false);
                        }
                    }else{
                        pro.getWriteMethod().invoke(returned,str);
                    }
                }catch (Exception e){
                    throw new RuntimeException("reqest 转换 obj 时调用 写入方法，设置参数转换异常");
                }

            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return returned;
    };
}
